package logger

import (
	"context"
	"fmt"
	"io"
)

var _ LoggerHelper = &NameLog{}

type NameLog struct {
	log    LoggerHelper
	name   string
	prefix string
}

func (n *NameLog) GetOutWriter() io.Writer {
	return n.log.GetOutWriter()
}

func NewNameLog(log LoggerHelper, name string) *NameLog {
	return &NameLog{
		log:    log,
		name:   name,
		prefix: fmt.Sprintf("[  %s ]", name),
	}
}

func NewNameLogWithDefaultLog(name string) *NameLog {
	return NewNameLog(GetLogger(), name)
}
func (n *NameLog) addPrefix(msg string) string {
	return fmt.Sprintf("%s %s", n.prefix, msg)
}

func (n *NameLog) Debug(msg string) {
	msg = n.addPrefix(msg)
	n.log.Debug(msg)
}
func (n *NameLog) DebugF(format string, v ...interface{}) {
	format = n.addPrefix(format)
	n.log.DebugF(format, v...)
}
func (n *NameLog) DebugContext(ctx context.Context, msg string) {
	msg = n.addPrefix(msg)
	n.log.DebugContext(ctx, msg)
}
func (n *NameLog) DebugContextF(ctx context.Context, format string, v ...interface{}) {
	format = n.addPrefix(format)
	n.log.DebugContextF(ctx, format, v...)
}
func (n *NameLog) Info(msg string) {
	msg = n.addPrefix(msg)
	n.log.Info(msg)
}
func (n *NameLog) InfoF(format string, v ...interface{}) {
	format = n.addPrefix(format)
	n.log.InfoF(format, v...)
}
func (n *NameLog) InfoContext(ctx context.Context, msg string) {
	msg = n.addPrefix(msg)
	n.log.InfoContext(ctx, msg)
}
func (n *NameLog) InfoContextF(ctx context.Context, format string, v ...interface{}) {
	format = n.addPrefix(format)
	n.log.InfoContextF(ctx, format, v...)
}
func (n *NameLog) Warn(msg string) {
	msg = n.addPrefix(msg)
	n.log.Warn(msg)
}
func (n *NameLog) WarnF(format string, v ...interface{}) {
	format = n.addPrefix(format)
	n.log.WarnF(format, v...)
}
func (n *NameLog) WarnContext(ctx context.Context, msg string) {
	msg = n.addPrefix(msg)
	n.log.WarnContext(ctx, msg)
}
func (n *NameLog) WarnContextF(ctx context.Context, format string, v ...interface{}) {
	format = n.addPrefix(format)
	n.log.WarnContextF(ctx, format, v...)
}
func (n *NameLog) Error(msg string) {
	msg = n.addPrefix(msg)
	n.log.Error(msg)
}
func (n *NameLog) ErrorF(format string, v ...interface{}) {
	format = n.addPrefix(format)
	n.log.ErrorF(format, v...)
}
func (n *NameLog) ErrorContext(ctx context.Context, msg string) {
	msg = n.addPrefix(msg)
	n.log.ErrorContext(ctx, msg)
}
func (n *NameLog) ErrorContextF(ctx context.Context, format string, v ...interface{}) {
	format = n.addPrefix(format)
	n.log.ErrorContextF(ctx, format, v...)
}
